import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

/**
 * 类名： D服务器窗口
 * 描述：The Server UI. 服务器窗口
 */
public class D服务器窗口 extends JFrame implements ActionListener {
    protected JTabbedPane tpServer;
/*- 声明一个名为tpServer的JTabbedPane对象，用于创建选项卡式的容器。*/
    // 服务器信息面板
    protected JPanel pnlServer;// 声明一个名为pnlServer的JPanel对象，用于放置服务器信息。
    protected JPanel pnlServerInfo;
// 声明一个名为pnlServerInfo的JPanel对象，用于放置服务器的详细信息。
    protected JLabel lblNumber;
    // 声明一个名为lblNumber的JLabel对象，用于显示在线用户数的标签。
    protected JLabel lblServerName;
    //- 声明一个名为lblServerName的JLabel对象，用于显示服务器名称的标签。
    protected JLabel lblIP;
    //声明一个名为lblIP的JLabel对象，用于显示服务器IP的标签。
    protected JLabel lblPort;
    //声明一个名为lblPort的JLabel对象，用于显示服务器端口的标签。
    protected JLabel lblLog;
    //声明一个名为lblLog的JLabel对象，用于显示日志的标签。

    protected JTextField txtNumber;//- 声明一个名为txtNumber的JTextField对象，用于显示在线用户数的文本框。
    protected JTextField txtServerName;
    /* 声明一个名为txtServerName的JTextField对象，用于显示服务器名称的文本框。*/
    protected JTextField txtIP;
    /*- 声明一个名为txtIP的JTextField对象，用于显示服务器IP的文本框。*/
    protected JTextField txtPort;//- 声明一个名为txtPort的JTextField对象，用于显示服务器端口的文本框。
    protected JButton btnStop;// 声明一个名为btnStop的JButton对象，用于关闭服务器的按钮。
    protected JButton btnSaveLog;// 声明一个名为btnSaveLog的JButton对象，用于保存日志的按钮。
    protected TextArea taLog;
//声明一个名为taLog的TextArea对象，用于显示日志的文本区域。
    // 用户信息面板
    protected JPanel pnlUser;// 声明一个名为pnlUser的JPanel对象，用于放置用户信息。
    protected JLabel lblUser;// 声明一个名为lblUser的JLabel对象，用于显示用户信息的标签。
    protected JList lstUser;//声明一个名为lstUser的JList对象，用于显示用户列表。
    protected JScrollPane spUser;
/*声明一个名为spUser的JScrollPane对象，用于添加用户列表的滚动条。
 */
    // 关于本软件
    protected JPanel pnlAbout;/*声明一个名为pnlAbout的JPanel对象，用于放置关于本软件的信息。*/
    protected JLabel lblVersionNo;/*- 声明一个名为lblVersionNo的JLabel对象，用于显示软件版本号的标签。*/
    protected JLabel lblAbout;/*声明一个名为lblAbout的JLabel对象，用于显示关于本软件的标签。*/

    public D服务器窗口() {
        // 构造函数，用于初始化服务器窗口的外观和布局。
        super(C常量.APP_SERVER_NAME);
        // 调用父类JFrame的构造函数，设置服务器窗口的标题为常量APP_SERVER_NAME的值。
        setSize(550, 500);
        // - 设置服务器窗口的大小为550x500像素。
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置当关闭服务器窗口时，默认的关闭操作为退出程序。
        setResizable(false);//设置服务器窗口不可调整大小。
        Dimension scr = Toolkit.getDefaultToolkit().getScreenSize();// 在屏幕居中显示
        Dimension fra = this.getSize();//获取服务器窗口的大小。
        if (fra.width > scr.width) {
            //- 如果服务器窗口的宽度大于屏幕的宽度，则将服务器窗口的宽度设置为屏幕的宽度。
            fra.width = scr.width;
        }
        if (fra.height > scr.height) {
            fra.height = scr.height;
        }//如果服务器窗口的高度大于屏幕的高度，则将服务器窗口的高度设置为屏幕的高度。
        this.setLocation((scr.width - fra.width) / 2,
                (scr.height - fra.height) / 2);
//设置服务器窗口在屏幕上居中显示。
        // 服务器信息
        pnlServerInfo = new JPanel(new GridLayout(14, 1));
        // 创建一个新的JPanel对象，使用GridLayout布局管理器，并设置为14行1列的网格布局。
        pnlServerInfo.setBackground(new Color(52, 130, 203));
        /* 设置服务器信息面板的背景颜色。*/
        pnlServerInfo.setFont(new Font(C常量.FONT_SONG, 0, 12));
        //设置服务器信息面板的字体样式。
        pnlServerInfo.setBorder(BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder(""),
                BorderFactory.createEmptyBorder(1, 1, 1, 1)));
//设置服务器信息面板的边框。
        lblNumber = new JLabel(C常量.ONLINE_USERS_NUM);
        // 创建一个新的JLabel对象，设置标签的文本为常量ONLINE_USERS_NUM的值。
        lblNumber.setForeground(Color.YELLOW);
        //设置标签的前景色为黄色。
        lblNumber.setFont(new Font(C常量.FONT_SONG, 0, 12));//设置标签的字体样式。
        txtNumber = new JTextField(C常量.ZERO_NUM, 10);//创建一个新的JTextField对象，设置文本框的初始文本为常量ZERO_NUM的值
        // ，并指定文本框的列数为10。
        txtNumber.setBackground(Color.decode("#d6f4f2"));//设置文本框的背景颜色。
        txtNumber.setFont(new Font(C常量.FONT_SONG, 0, 12));//设置文本框的字体样式。
        txtNumber.setEditable(false);
//设置文本框为不可编辑状态。
        lblServerName = new JLabel(C常量.SERVER_NAME);// 创建一个新的JLabel对象，设置标签的文本为常量SERVER_NAME的值。
        lblServerName.setForeground(Color.YELLOW);//设置标签的前景色为黄色。
        lblServerName.setFont(new Font(C常量.FONT_SONG, 0, 12));//设置标签的字体样式。
        txtServerName = new JTextField(10);// 创建一个新的JTextField对象，并指定文本框的列数为10。
        txtServerName.setBackground(Color.decode("#d6f4f2"));//设置文本框的背景颜色。
        txtServerName.setFont(new Font(C常量.FONT_SONG, 0, 12));//设置文本框的字体样式。
        txtServerName.setEditable(false);
/*设置文本框为不可编辑状态。*/
        lblIP = new JLabel(C常量.SERVER_IP);//创建一个新的JLabel对象，设置标签的文本为常量SERVER_IP的值。
        lblIP.setForeground(Color.YELLOW);//设置标签的前景色为黄色。
        lblIP.setFont(new Font(C常量.FONT_SONG, 0, 12));//设置标签的字体样式。
        txtIP = new JTextField(10);//创建一个新的JTextField对象，并指定文本框的列数为10。
        txtIP.setBackground(Color.decode("#d6f4f2"));//设置文本框的背景颜色。
        txtIP.setFont(new Font(C常量.FONT_SONG, 0, 12));//设置文本框的字体样式。
        txtIP.setEditable(false);
//设置文本框为不可编辑状态。
        lblPort = new JLabel(C常量.SERVER_PORT_DESC);//创建一个新的JLabel对象，设置标签的文本为常量SERVER_PORT_DESC的值。
        lblPort.setForeground(Color.YELLOW);//设置标签的前景色为黄色。
        lblPort.setFont(new Font(C常量.FONT_SONG, 0, 12));
        txtPort = new JTextField(String.valueOf(C常量.SERVER_PORT), 10);
        txtPort.setBackground(Color.decode("#d6f4f2"));
        txtPort.setFont(new Font(C常量.FONT_SONG, 0, 12));
        txtPort.setEditable(false);

        btnStop = new JButton(C常量.CLOSE_SERVER);
        btnStop.addActionListener(new ActionListener() {
            /*为按钮添加一个ActionListener，用于监听按钮的点击事件。*/
            public void actionPerformed(ActionEvent arg0) {
                closeServer();
            }
        });
        btnStop.setBackground(Color.ORANGE);//设置关闭服务器按钮的背景颜色为橙色。
        btnStop.setFont(new Font(C常量.FONT_SONG, 0, 12));

        pnlServerInfo.setBounds(5, 5, 100, 400);//设置服务器信息面板的位置和大小。
        pnlServerInfo.add(lblNumber);
        pnlServerInfo.add(txtNumber);
        pnlServerInfo.add(lblServerName);
        pnlServerInfo.add(txtServerName);
        pnlServerInfo.add(lblIP);
        pnlServerInfo.add(txtIP);
        pnlServerInfo.add(lblPort);
        pnlServerInfo.add(txtPort);

        // 服务器面板
        pnlServer = new JPanel();
        pnlServer.setLayout(null);
        pnlServer.setBackground(new Color(52, 130, 203));

        lblLog = new JLabel(C常量.SERVER_LOG);// 创建一个新的JLabel对象，设置标签的文本为常量ABOUT_INFO的值。
        lblLog.setForeground(Color.YELLOW);//设置标签的前景色为黄色。
        lblLog.setFont(new Font(C常量.FONT_SONG, 0, 12));
        taLog = new TextArea(20, 50);
        taLog.setFont(new Font(C常量.FONT_SONG, 0, 12));

        btnSaveLog = new JButton(C常量.SAVE_LOG);
        btnSaveLog.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                saveLog();
            }
        });
        btnSaveLog.setBackground(Color.ORANGE);
        btnSaveLog.setFont(new Font(C常量.FONT_SONG, 0, 12));

        lblLog.setBounds(110, 5, 100, 30);
        taLog.setBounds(110, 35, 300, 370);
        btnStop.setBounds(200, 410, 120, 30);
        btnSaveLog.setBounds(320, 410, 120, 30);

        //
        pnlServer.add(pnlServerInfo);
        //将服务器信息面板添加到服务器面板中。这将在服务器面板上显示服务器的基本信息，
        // 如服务器编号、服务器名称、IP地址和端口号的标签和文本框。
        pnlServer.add(lblLog);
        /*将日志标签添加到服务器面板中。这将在服务器面板上显示一个标签，用于表示日志区域。*/
        pnlServer.add(taLog);
        /*将日志文本区域添加到服务器面板中。这将在服务器面板上显示一个可编辑的文本区域，用于记录服务器的日志信息。*/
        pnlServer.add(btnStop);
        /*将关闭服务器按钮添加到服务器面板中。这将在服务器面板上显示一个按钮，用于关闭服务器。*/
        pnlServer.add(btnSaveLog);
/*将保存日志按钮添加到服务器面板中。这将在服务器面板上显示一个按钮，用于保存服务器的日志信息到文件。
 */
        // 用户面板
        pnlUser = new JPanel();
        pnlUser.setLayout(null);
        pnlUser.setBackground(new Color(52, 130, 203));
        pnlUser.setBorder(BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder(""),
                BorderFactory.createEmptyBorder(1, 1, 1, 1)));

        lblUser = new JLabel(C常量.ONLINE_USERS_LIST);
        lblUser.setFont(new Font(C常量.FONT_SONG, 0, 12));
        lblUser.setForeground(Color.YELLOW);

        lstUser = new JList();
        lstUser.setFont(new Font(C常量.FONT_SONG, 0, 12));
        lstUser.setVisibleRowCount(17);
        lstUser.setFixedCellWidth(180);
        lstUser.setFixedCellHeight(18);

        spUser = new JScrollPane();
        spUser.setBackground(Color.cyan);
        spUser.setFont(new Font(C常量.FONT_SONG, 0, 12));
        spUser.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        spUser.getViewport().setView(lstUser);

        pnlUser.setBounds(50, 5, 300, 400);
        lblUser.setBounds(50, 10, 100, 30);
        spUser.setBounds(50, 35, 200, 360);

        pnlUser.add(lblUser);
        pnlUser.add(spUser);

        // 软件信息
        pnlAbout = new JPanel();
        pnlAbout.setLayout(null);
        pnlAbout.setBackground(new Color(52, 130, 203));
        pnlAbout.setFont(new Font(C常量.FONT_SONG, 0, 14));

        lblVersionNo = new JLabel(C常量.VERSION_INFO);
        lblVersionNo.setFont(new Font(C常量.FONT_SONG, 0, 14));
        lblVersionNo.setForeground(Color.YELLOW);

        lblAbout = new JLabel();
        lblAbout.setFont(new Font(C常量.FONT_SONG, 0, 14));
        lblAbout.setText(C常量.APP_ABOUT_INFO);
        lblAbout.setForeground(Color.YELLOW);

        lblVersionNo.setBounds(110, 5, 100, 30);
        lblAbout.setBounds(110, 35, 400, 50);

        pnlAbout.add(lblVersionNo);
        pnlAbout.add(lblAbout);

        // 主标签面板
        tpServer = new JTabbedPane(JTabbedPane.TOP);
        tpServer.setBackground(Color.CYAN);
        tpServer.setFont(new Font(C常量.FONT_SONG, 0, 14));

        tpServer.add(C常量.SERVER_ADMIN, pnlServer);
        tpServer.add(C常量.ONLINE_USERS, pnlUser);
        tpServer.add(C常量.ABOUT_APP, pnlAbout);

        this.getContentPane().add(tpServer);
        setVisible(true);
    }

    protected void closeServer() {
        //调用dispose()方法关闭服务器窗口。
        this.dispose();
    }

    protected void saveLog() {
        //定义一个保存日志的方法。
        try {
            FileOutputStream fileoutput = new FileOutputStream("log.txt", true);
            String temp = taLog.getText();
            fileoutput.write(temp.getBytes());
            fileoutput.close();
            JOptionPane.showMessageDialog(null, C常量.SAVE_LOG_FILE);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
//在saveLog()方法中，尝试将日志文本写入到文件中，并显示保存成功的消息框。
    public void actionPerformed(ActionEvent evt) {
    }
//实现ActionListener接口的方法，用于处理事件。
    /**
     * 服务器窗口
     *
     * @param args
     */
    public static void main(String[] args) {
        new D服务器窗口();
        //程序的入口点，创建一个服务器窗口的实例。
    }
}
